/**
 * @file LMM_Info.h
 * @brief The class stores information of lmm.
 * @author XDDDD
 * @version 
 * @date 2021-04-28
 */

#ifndef __PAISLEYPARK__LMM_Info_H__
#define __PAISLEYPARK__LMM_Info_H__

#include <iostream>

class LMM_Info {
private:
	double* __Alpha;
	double* __Beta;
	std::size_t __S;
	std::size_t __P;
public:
	/**
	 * @brief Constructor.
	 */
	LMM_Info();
	/**
	 * @brief Constructor with s steps s.
	 *
	 * @param _s The number of steps.
	 */
	LMM_Info(const std::size_t _s);
	/**
	 * @brief Constructor.
	 *
	 * @param _a Given alpha[s + 1];
	 * @param _b Given beta[s + 1];
	 * @param _s Given number of steps.
	 * @param _p Given order.
	 */
	LMM_Info(const double* _a, const double *_b, const std::size_t _s, const std::size_t _p);
	/**
	 * @brief Destructor.
	 */
	~LMM_Info();
	/**
	 * @brief Get alpha[i]
	 *
	 * @param _i The index.
	 *
	 * @return alpa[i].
	 */
	const double get_alpha_i(const std::size_t _i) const;
	/**
	 * @brief Get beta[i]
	 *
	 * @param _i The index
	 *
	 * @return beta[i]
	 */
	const double get_beta_i(const std::size_t _i) const;
	/**
	 * @brief Get number of steps.
	 *
	 * @return Number of steps.
	 */
	const std::size_t get_s() const;
	/**
	 * @brief Get order of accuracy.
	 *
	 * @return Order of accuracy.
	 */
	const std::size_t get_p() const;
	/**
	 * @brief Set alpha[s + 1]
	 *
	 * @param _a The given list of alpha[s + 1].
	 */
	void set_alpha(const double* _a);
	/**
	 * @brief Set beta[s + 1]
	 *
	 * @param _b The given list of beta[s + 1].
	 */
	void set_beta(const double* _b);
	/**
	 * @brief Set the lmm information.
	 *
	 * @param _a The given list of alpha[s + 1].
	 * @param _b The given list of beta[s + 1].
	 * @param _s The number of steps.
	 * @param _p The order of accuracy.
	 */
	void set(const double* _a, const double* _b, const std::size_t _s, const std::size_t _p);
	/**
	 * @brief Reload operator =.
	 *
	 * @param _lmm_info The given lmm_info.
	 *
	 * @return This
	 */
	const LMM_Info& operator=(const LMM_Info &_lmm_info);
};

#else
//Do nothing.
#endif
